/* Hilo que consulta continuamente la carga del procesador y notifica
 envia un TRAP cuando ésta es superior a un umbral*/

package clientegestionred;

import common.Cons;
import common.SesionSNMP;
import java.io.IOException;

import java.util.Date;
import java.util.LinkedList;

import org.snmp4j.PDU;
import org.snmp4j.Snmp;
import org.snmp4j.mp.*;
import org.snmp4j.smi.*;


public class HiloConsultaUsoProcesador extends Thread implements Cons{

    private static final float LIMITE = 90; //maxima carga permitida en %

    private static final int ESPERA = 15000; //tiempo de espera por consulta (ms)

    private Snmp snmp; //objeto para la comunicacion SNMP con el agente

    private UsoProcesador usoproc; //para la consulta de la carga del procesador

    private boolean exit = false; //para la finalizacion del hilo

    // Sesiones
    private SesionSNMP sesionLectura;
    private SesionSNMP sesionEnvioTraps;


    /* Constructor */
    HiloConsultaUsoProcesador(SesionSNMP sesion){
        sesionLectura = sesion;
        usoproc = new UsoProcesador(sesionLectura);
    }

    /* Iniciar el hilo que consulta por la carga cada 5 seg*/
    public void run(){

        sesionEnvioTraps = new SesionSNMP(IP_GESTOR + "/" + TRAP_PORT,
                TRAP_COMMUNITY);

        while(!exit){
            LinkedList list = usoproc.getListOfLoads();
            if (list !=  null){
                for (int i = 0; i < list.size(); i++){
                    if ((Integer)list.get(i) >= LIMITE){//si se supera el limite
                        sendTrap();                    //enviar la notificacion
                        break;
                    }
                }
            }
            try {
                this.sleep(ESPERA);
            } catch (InterruptedException ex) { }
        }//while

        try {
            sesionEnvioTraps.stop();
        } catch (IOException ex) {}
    }//run

    /* Enviar TRAP de sobrecarga */
    private void sendTrap(){
        try
        {            
            // Crear PDU para version 2
            PDU pdu = new PDU();

            // Añadir la VariableBinding especifica de nuestra TRAP
            pdu.add(new VariableBinding(new OID(HR_PROCESSOR_LOAD),
                    new OctetString("Sobrecarga")));

            // Otra informacion adicional
            pdu.add(new VariableBinding(SnmpConstants.sysUpTime,
                    new OctetString(new Date().toString())));
            pdu.add(new VariableBinding(SnmpConstants.snmpTrapOID,
                    new OID(HR_PROCESSOR_LOAD)));
            pdu.add(new VariableBinding(SnmpConstants.snmpTrapAddress,
                    new IpAddress(IP_GESTOR)));

            pdu.setType(PDU.TRAP);

            // Enviar la PDU
            snmp = sesionEnvioTraps.getSnmp();
            snmp.send(pdu, sesionEnvioTraps.getTarget());
        }
        catch (Exception e)
        {
            System.err.println("Error mandando V2 Trap a " + IP_GESTOR +
                    " al Puerto " + TRAP_PORT);
            System.err.println("Exception Message = " + e.getMessage());
        }
    }//sendtrap

    /* Cambiar el valor de la variable exit para finalizar la ejecucion */
    public void setExit(boolean b){
        exit = b;
    }

}//class
